package com.jjh.users.util;

import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.jjh.common.util.ConstatFinalUtil;
import com.jjh.common.util.DateUtil;
import com.jjh.common.util.PageInfoUtil;
import com.jjh.common.util.RedisUtil;
import com.jjh.users.service.IUsersDbService;
import com.jjh.users.service.IUsersOperService;

/**
 * 测试crondTask(定时和间隔)
 * 
 * @author lby
 */
@Component
public class SpringTaskUtil
{
	@Autowired
	private IUsersOperService usersOperService;
	@Autowired
	private IUsersDbService usersDbService;
	@Autowired
	private RedisUtil redisUtil;
	@Autowired
	private DateUtil dateUtil;
	
	/**
	 * 定时任务
	 * 1/3:每隔3秒钟的第二秒执行(0,1-执行),2
	 * 3:只要秒数是3的时候执行
	 * 
	 * {秒} {分} {时} {日期（具体哪天）} {月} {星期}
	 * 30    *    *    *               *     ?
	 */
//	@Scheduled(cron = "15 0 0 * * ?")
//	public void method1() {
//		ConstatFinalUtil.SYS_LOGGER.info("==method1==开始");
//		Date now = new Date();
//		JSONObject resultJSON = this.usersOperService.saveOneStatResService(now);
//		ConstatFinalUtil.SYS_LOGGER.info("==method1==结束:{}",resultJSON);
//	}
	
	/**
	 * 和Spark一样的理念，准实时
	 * 过去10秒钟的数据
	 * 比如说现在是:00:00:10
	 * 计算的是:00:00:00---->00:00:10的数据
	 * 计算出一个结果; a; + a1; 存储到一个地方:redis
	 * 比如说现在是:00:00:20
	 * 计算的是:00:00:10---->00:00:20的数据
	 * 计算出一个结果; a; + a2 
	 * 今天的数据:是否:a1 + a2 ; 先取redis的结果+新10秒的结果;存储到一个地方:redis
	 * 比如说现在是:00:00:30
	 * 计算的是:00:00:20---->00:00:30的数据;
	 * 计算出一个结果; a; + a3 先取redis的结果+新10秒的结果;存储到一个地方:redis
	 */
	@Scheduled(cron = "0/10 * * * * ?")
	public void method2() {
		ConstatFinalUtil.SYS_LOGGER.info("==实时处理开始==");
		PageInfoUtil pageInfoUtil = new PageInfoUtil();
		Map<String,Object> condMap = new HashMap<String,Object>();
		int interval = 10 ; 
		/* 如果现在是00:00:00-->00:00:10;先删除redis中的数据 */
		Calendar calendar = Calendar.getInstance() ; 
		if(calendar.get(Calendar.HOUR_OF_DAY) == 0 && calendar.get(Calendar.MINUTE) == 0
			&& 
			calendar.get(Calendar.SECOND) > 9 && calendar.get(Calendar.SECOND) <= interval + 5 )
		{
			/* 每天00:00:10的时候是第一次，我位要删除昨天的数据 */
			this.redisUtil.delete(RedisUtil.KEY_USERS_DATA);
			ConstatFinalUtil.SYS_LOGGER.info("==清空昨天数据完成==");
			Date now = new Date();
			JSONObject resultJSON = this.usersOperService.saveOneStatResService(now);
			ConstatFinalUtil.SYS_LOGGER.info("==method1==结束:{}",resultJSON);
		}
		/* 从redis中取 10秒之前的所有数据的结果 */
		Object val = this.redisUtil.get(RedisUtil.KEY_USERS_DATA);
		/* 如果取不到呢?表示木有;00:00:00;要把这个数据给清空 */
		/* 这个结果是之前的结果 */
		JSONObject dataJSON = new JSONObject();
		if(val != null) {
			/* 如果取到呢?取的是10秒之前的结果 */
			/* 取到数据;
			 * redis中放的是json字符串
			 *  */
			dataJSON = (JSONObject) JSON.parse(val + "");
		}
		/*
		 * 因为批处理是10秒钟
		 * 但是程序执行需要1分钟
		 * spring会把它隔过去
		 * */
		String dateNow = this.dateUtil.dateToStr(new Date());
		if(!dateNow.equalsIgnoreCase(dataJSON.getString("createTime")))
		{
			this.redisUtil.delete(RedisUtil.KEY_USERS_DATA);
			ConstatFinalUtil.SYS_LOGGER.info("==清空昨天数据完成(日期不相等)==");
		}
		/* 计算这10秒的结果 */
		condMap.put("operType", "dataStat");
		Date edDate = calendar.getTime();
		calendar.add(Calendar.SECOND, -interval);
		Date stDate = calendar.getTime() ; 
		condMap.put("st", stDate);
		condMap.put("ed", edDate);
		/* 始终只有一条记录,因为只查询今天的前10秒的数据 */
		List<Map<String, Object>> statLogList = this.usersDbService.statLogListService(pageInfoUtil ,condMap);
		if(!statLogList.isEmpty()) {
			Map<String, Object> map = statLogList.get(0);
			/* 把map变成json;
			 * 时间:
			 * 次数
			 *  */
			//JSONObject dataTempJSON = (JSONObject) JSON.toJSON(map);
			int totalCountTemp = Integer.parseInt(String.valueOf(map.get("totalCount")));
			/* 相加的结果 */
			int totalCount = 0 ;
			if(dataJSON.get("totalCount") != null)
			{
				totalCount = dataJSON.getInteger("totalCount");
			}
			
			totalCount = totalCount + totalCountTemp ; 
			dataJSON.put("totalCount", totalCount);
			dataJSON.put("createTime", map.get("createTime"));
		}
		/* 这10秒的结果+10秒之前的数据,就是最新的数据 */
		/* 存储到redis中 */
		this.redisUtil.put(RedisUtil.KEY_USERS_DATA, dataJSON.toJSONString());
		ConstatFinalUtil.SYS_LOGGER.info("==实时处理结束==");
	}
}
